openssl与https构建
====================================================
（1）：加密算法和协议：
    对称加密：数据加密（保密性），（3DES，AES）
    公钥加密：身份认证、密钥交换、数据加密（不常用，比对称加密要慢3个数量级），（RSA，DSA）
    单向加密：数据完整性，（MD5, SHA1, ...）
    密钥交换：RSA，DH（迪菲-赫尔曼），ECDH（椭圆曲线DH），ECDHE（临时椭圆曲线DH）

（2）：SSL/TLS
        SSL: 安全套接字层（ssl 1.0, ssl 2.0, ssl 3.0）
        TLS：传输层安全 （tls 1.0, tls 1.1, tls 1.2, tls 1.3）

（3）：SSL会话主要三步
    客户端向服务器端索要并验正证书。
    双方协商生成“会话密钥”。
    双方采用“会话密钥”进行加密通信。

（4）：SSL Handshake Protocol：
        第一阶段：ClientHello：
            支持的协议版本，比如tls 1.2；
            客户端生成一个随机数，稍后用户生成“会话密钥”
            支持的加密算法，比如AES、3DES、RSA；
            支持的压缩算法；

        第二阶段：ServerHello
            确认使用的加密通信协议版本，比如tls 1.2；
            服务器端生成一个随机数，稍后用于生成“会话密钥”
            确认使用的加密方法；
            服务器证书；

        第三阶段：
            验正服务器证书，在确认无误后取出其公钥；（发证机构、证书完整性、证书持有者、证书有效期、吊销列表）               
            发送以下信息给服务器端：
                一个随机数；
                编码变更通知，表示随后的信息都将用双方商定的加密方法和密钥发送；
                客户端握手结束通知；

        第四阶段：
            收到客户端发来的第三个随机数pre-master-key后，计算生成本次会话所有到的“会话密钥”；
            向客户端发送如下信息：
                编码变更通知，表示随后的信息都将用双方商定的加密方法和密钥发送；
                服务端握手结束通知；

（5）PKI：公钥基础设施
    签证机构：CA
    注册机构：RA
    证书吊销列表：CRL
    证书存取库


（6）：OpenSSL组件：
        libcrypto, libssl主要由开发者使用。
        openssl：多用途命令行工具。

（8）：命令分为三类：
    标准命令：Standard commands 
    消息摘要命令（dgst子命令）：Message Digest commands(see the `dgst' command for more details)
    加密命令（enc子命令）：Cipher commands (see the `enc' command for more details)

（9）：显示版本：
~]# openssl version
    OpenSSL 1.0.1e-fips 11 Feb 2013

（10）：对称加密：
    工具：openssl  enc,  gpg
    支持的算法：3des, aes, blowfish, towfish
        enc：
            ~]# cd ~
            ~]# ~]# cp /etc/fstab ./
            ~]# openssl enc -e -des3 -a -salt -in fstab -out fstab.ciphertext
                enter des-ede3-cbc encryption password:
                Verifying - enter des-ede3-cbc encryption password:
            ~]# cat fstab.ciphertext
                U2FsdGVkX18srzTCwPmMz............
            ~]# rm -rf fstab
            ~]# openssl enc -d -des3 -a -salt -out fstab.plaintext -in fstab.ciphertext
                enter des-ede3-cbc decryption password:
            ~]# cat fstab.plaintext

   （11）： 单向加密：
        工具：openssl dgst, md5sum, sha1sum, sha224sum, ...
            ~]# md5sum fstab.plaintext 
                ed15974ad690e48b77abc0e331d1c99a  fstab.plaintext
            ~]# openssl dgst -md5 fstab.plaintext 
                MD5(fstab.plaintext)= ed15974ad690e48b77abc0e331d1c99a

（12）：生成用户密码：
        工具：passwd，openssl passwd
            ~]# openssl passwd -1 -salt 12345678
                Password: 
                $1$12345678$G4AxYGwCqSUov8Usa..zU1

（13）：生成随机数：
        ~]# openssl rand -base64 10
            bA0b0ejNW2ZzVQ==
        ~]# openssl rand -hex 10
            5f1b9a1721c0d3ad895b
        ~]# openssl passwd -1 -salt $(openssl rand -hex 4)
            Password: 
            $1$cb9efa3a$0UrjYh8JAyVc4Tt5KNUpj.

（14）：公钥加密：
        加密解密：
            算法：RSA，ELGamal
            工具：openssl  rsautl, gpg
        数字签名：
            算法：RSA， DSA， ELGamal
            工具：
        密钥交换：
            算法：DH

        生成秘钥：
            生成私钥：
                ~]# openssl genrsa 1024  # 必须是2的次方
                ~]# openssl genrsa -out /tmp/key.private 1024
                ~]# (umask 077; openssl genrsa -out /tmp/key3.private 2048) # ()为子shell
            提取公钥：
                ~]# openssl rsa -in /tmp/key3.private -pubout

（15）：Linux系统上随机数生成器：
    /dev/random：仅从熵池返回随机数；随机数用尽，阻塞。
    /dev/urandom：从熵池返回随机数；随机数用尽，会利用软件生成伪随机数，非阻塞。

（16）：熵池中随机数的来源：
        硬盘IO中断时间间隔。
        键盘IO中断时间间隔。


___________________________________________________________________________________________
构建私有OpenSSL：最少两台服务器。
    1：构建私有CA服务器：172.18.21.70
        配置文件： /etc/pki/tls/openssl.cnf

        (1) 生成私钥；
            ~]# (umask 077; openssl genrsa -out /etc/pki/CA/private/cakey.pem 4096)
                Generating RSA private key, 4096 bit long modulus
                ................................++
                .....................................................................................................................................++
                e is 65537 (0x10001)

        (2) 生成自签证书（CA自己给自己签证书）；172.18.21.70
            ~]# openssl req -new -x509 -key /etc/pki/CA/private/cakey.pem -out /etc/pki/CA/cacert.pem
                ......
                # 国家名称（2字母代码） 
                Country Name (2 letter code) [XX]:CN
                # 州或省名（完整的名字） 
                State or Province Name (full name) []:Beijing
                # 地方名称（例如，城市）[默认城市] 
                Locality Name (eg, city) [Default City]:Beijing
                # 组织名称（如，公司）[默认公司] 
                Organization Name (eg, company) [Default Company Ltd]:ca
                # 组织单位名称（如，部门） 
                Organizational Unit Name (eg, section) []:ca
                # 共同的名字（如，你的名字或您的服务器的主机名）[ ] 
                Common Name (eg, your name or your server's hostname) []:www.ca.com
                # 电子邮件地址
                Email Address []:admin@ca.com

                注释：
                    -new：生成新证书签署请求。
                    -x509：生成自签格式证书，专用于创建私有CA时。
                    -key：生成请求时用到的私有文件路径。
                    -out：生成的请求文件路径；如果自签操作将直接生成签署过的证书。
                    -days：证书的有效时长，单位是day。可以不指定默认即可。

        (3) 为CA提供所需的目录及文件。
                ~]# ls /etc/pki/CA/
                    cacert.pem  certs  crl  newcerts  private
                ~]# mkdir  -pv  /etc/pki/CA/{certs,crl,newcerts}    # 如果目录存在就不必创建。
                ~]# touch  /etc/pki/CA/{serial,index.txt}
                ~]# echo  01 > /etc/pki/CA/serial


        2：要用到证书服务器，向CA请求签署证书：172.18.21.60
                步骤：（以httpd为例）
                    (1) 用到证书的服务器，生成私钥；172.18.21.60
                        ~]# yum -y install httpd
                        ~]# mkdir  /etc/httpd/ssl
                        ~]# cd  /etc/httpd/ssl
                        ~]# (umask  077; openssl  genrsa -out  /etc/httpd/ssl/httpd.key  2048)

                    (2) 用到证书的服务器，生成证书签署请求：172.18.21.60
                        ~]# openssl  req  -new  -key  /etc/httpd/ssl/httpd.key  -out /etc/httpd/ssl/httpd.csr  -days  365
Country Name (2 letter code) [XX]:CN
State or Province Name (full name) []:Beijing
Locality Name (eg, city) [Default City]:Beijing
Organization Name (eg, company) [Default Company Ltd]:a
Organizational Unit Name (eg, section) []:a
Common Name (eg, your name or your server's hostname) []:www.a.com
Email Address []:admin@a.com

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:

                    (3) 将请求通过可靠方式发送给CA主机；172.18.21.60
                        例如：
                        #####~]# scp certs/httpd.crt root@172.18.250.133:/etc/httpd/ssl
]# scp httpd.csr root@172.18.21.70:/tmp

                    (4) CA主机上签署证书；172.18.21.70
                        ~]# openssl ca  -in  /tmp/httpd.csr  -out  /etc/pki/CA/certs/httpd.crt  -days  365

]# 
[root@localhost certs]# scp /etc/pki/CA/certs/httpd.crt root@172.18.21.60:/etc/httpd/ssl
]# yum install mod_ssl
]# httpd -M | grep ssl
[root@localhost conf.d]# rpm -ql mod_ssl
/etc/httpd/conf.d/ssl.conf
/usr/lib64/httpd/modules/mod_ssl.so
/var/cache/mod_ssl
/var/cache/mod_ssl/scache.dir
/var/cache/mod_ssl/scache.pag
/var/cache/mod_ssl/scache.sem

74 <VirtualHost _default_:443>
 75 
 76 # General setup for the virtual host, inherited from global configuration
 77 DocumentRoot "/var/www/html"
 78 ServerName www.useryx.com


                    (5) 证书查看
                        CA主机查看证书中的信息：
                            ~]# openssl  x509  -in /etc/pki/CA/certs/httpd.crt  -noout  -serial  -subject
                        用到证书的服务器查看信息：
                            ~]# openssl x509 -in /etc/httpd/ssl/httpd.crt -noout -serial -subject

        3：吊销证书：
                (1) 客户端获取要吊销的证书的serial（在使用证书的主机执行）：
                    ~]# openssl  x509  -in /etc/pki/CA/certs/httpd.crt  -noout  -serial  -subject

                (2) CA主机吊销证书
                    先根据客户提交的serial和subject信息，对比其与本机数据库index.txt中存储的是否一致；
                    # openssl  ca  -revoke  /etc/pki/CA/newcerts/SERIAL.pem（SERIAL：要换成证书真正的序列号）
                        ~]# CA]# openssl ca -revoke /etc/pki/CA/newcerts/01.pem 

                (3) 生成吊销证书的吊销编号（第一次吊销证书时执行,用于生成必要文件）
                    ~]# echo  01  > /etc/pki/CA/crlnumber
                
                (4) 更新证书吊销列表
                    ~]# openssl  ca  -gencrl  -out  /etc/pki/CA/thisca.crl 
                    
                    查看crl文件：
                        # openssl  crl  -in  /PATH/FROM/CRL_FILE.crl  -noout  -text

---------------------------------------------------------------------------------------------------------
            SSL会话的简化过程
                (1) 客户端发送可供选择的加密方式，并向服务器请求证书；
                (2) 服务器端发送证书以及选定的加密方式给客户端；
                (3) 客户端取得证书并进行证书验正：
                    如果信任给其发证书的CA：
                        (a) 验正证书来源的合法性；用CA的公钥解密证书上数字签名；
                        (b) 验正证书的内容的合法性：完整性验正
                        (c) 检查证书的有效期限；
                        (d) 检查证书是否被吊销；
                        (e) 证书中拥有者的名字，与访问的目标主机要一致；
                (4) 客户端生成临时会话密钥（对称密钥），并使用服务器端的公钥加密此数据发送给服务器，完成密钥交换；
                (5) 服务用此密钥加密用户请求的资源，响应给客户端；

                注意：SSL会话是基于IP地址创建；所以单IP的主机上，仅可以使用一个https虚拟主机；

